package platzerworld.kegeln.gui.ergebnis;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import platzerworld.kegeln.R;
import platzerworld.kegeln.common.ConstantsIF;
import platzerworld.kegeln.common.logging.LOG;
import platzerworld.kegeln.common.style.StyleManager;
import platzerworld.kegeln.db.ergebnis.ErgebnisSpeicher;
import platzerworld.kegeln.db.ergebnis.ErgebnisTbl;
import platzerworld.kegeln.db.spieler.SpielerSpeicher;
import platzerworld.kegeln.vo.ergebnis.ErgebnisVO;
import platzerworld.kegeln.vo.spieler.SpielerVO;
import android.app.AlertDialog;
import android.app.ListActivity;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.Typeface;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;

/**
 * Anzeigen eines Ergebnisses.
 * 
 * @author platzerg
 * 
 */
public class ErgebnisseAnzeigen extends ListActivity implements ConstantsIF {
	private static final long serialVersionUID = -2258679690297549370L;

	/** Kuerzel fuers Logging. */
	private static final String TAG = ErgebnisseAnzeigen.class.getSimpleName();
	
	private Button mAnlegenErgebnisButton;
	private Button mLoeschenErgebnisButton;
	private Button mBearbeitenErgebnisButton;

	private ErgebnisSpeicher mErgebnisSpeicher;
	private SpielerSpeicher mSpielerSpeicher;

	static ListView mErgebnisListView = null;
	
	private ArrayList<HashMap<String, String>> hashMapListForListView;
	
	HashMap<String, String> selHashMap;
	
	private long mEdSelectedItemId;
	
	private ErgebnisVO selectedErgebnisVO;
	
	private SpielerVO aktuellerSpieler = null;

	@Override
	protected void onCreate(Bundle icicle) {
		super.onCreate(icicle);
		LOG.v(TAG, "onCreate(): entered...");
		
		setContentView(R.layout.ergebnisse_anzeigen);
		setTitle(R.string.txt_ergebnis_anzeigen_titel);
		

		Bundle extras = getIntent().getExtras();
		if (extras == null) {
			return;
		}
		
		init();
		
		aktuellerSpieler = (SpielerVO) extras.getSerializable(INTENT_EXTRA_SPIELER);		
	}

	@Override
	protected void onStart() {
		zeigeErgebnisse();
		super.onStart();
	}

	@Override
	protected void onDestroy() {
		cleanDatabase();
		super.onDestroy();
	}
	
	@Override
	protected void onResume() {
		mLoeschenErgebnisButton.setEnabled(false);
		mBearbeitenErgebnisButton.setEnabled(false);
		super.onResume();
	}
	
	private void init(){
		initStyle();
		initWidgets();
		initListener();
		initContextMenu();
		initDatabase();
	}
	
	private void initStyle() {
		Typeface font = StyleManager.getInstance().init(this).getTypeface();
		TextView titeltext = (TextView) findViewById(R.id.txt_ergebnisse_titel);
		titeltext.setTypeface(font);
	}
	
	private void initWidgets(){
		mErgebnisListView = (ListView) this.findViewById(android.R.id.list);
		mAnlegenErgebnisButton = (Button) findViewById(R.id.sf_ergebnis_neuanlagen);
		mLoeschenErgebnisButton = (Button) findViewById(R.id.sf_ergebnis_loeschen);
		mBearbeitenErgebnisButton = (Button) findViewById(R.id.sf_ergebnis_bearbeiten);
	}
	
	private void initListener(){
		mAnlegenErgebnisButton.setOnClickListener(mErgebnisAnlegenListener);
		mLoeschenErgebnisButton.setOnClickListener(mErgebnisLoeschenListener);
		mBearbeitenErgebnisButton.setOnClickListener(mErgebnisBearbeitenListener);
		
		mErgebnisListView.setOnItemClickListener(mSpielerListViewOnItemClickListener);
		mErgebnisListView.setOnItemLongClickListener(mErgebnisListViewItemOnLongClickListener);
	}
	
	private void initContextMenu(){
	}
	
	private void initDatabase(){
		mErgebnisSpeicher = new ErgebnisSpeicher(this);
	}
	
	private void cleanDatabase(){
		if(null != mErgebnisSpeicher){
			mErgebnisSpeicher.schliessen();
		}
	}
	
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		if (resultCode == RESULT_OK && requestCode == REQUEST_CODE_ERGEBNIS_BEARBEITEN) {
			if (data.hasExtra(INTENT_EXTRA_NEUER_SPIELER)) {
				ErgebnisVO ergebnisVO = (ErgebnisVO) data.getExtras().getSerializable(INTENT_EXTRA_NEUER_SPIELER);
				if (null != ergebnisVO) {
					Toast.makeText(this, ergebnisVO.value, Toast.LENGTH_SHORT).show();
				} else {
					Toast.makeText(this, "NO ERGEBNIS", Toast.LENGTH_SHORT).show();
				}
			}
		} else if (resultCode == RESULT_OK && requestCode == REQUEST_CODE_ERGEBNIS_NEUANLEGEN) {
			if (data.hasExtra(INTENT_EXTRA_NEUER_SPIELER)) {
				ErgebnisVO ergebnisVO = (ErgebnisVO) data.getExtras().getSerializable(INTENT_EXTRA_NEUER_SPIELER);
				if (null != ergebnisVO) {
					Toast.makeText(this, ergebnisVO.value, Toast.LENGTH_SHORT).show();
				} else {
					Toast.makeText(this, "NO ERGEBNIS", Toast.LENGTH_SHORT).show();
				}
			}
		}
	}
	
	private final OnItemClickListener mSpielerListViewOnItemClickListener = new OnItemClickListener() {

		@Override
		public void onItemClick(AdapterView<?> parent, View arg1, int position, long id) {
			mLoeschenErgebnisButton.setEnabled(true);
			mBearbeitenErgebnisButton.setEnabled(true);
			for(int i=0; i<parent.getChildCount(); i++) {
			     if(i == position) {
			    	 parent.getChildAt(i).setBackgroundColor(Color.rgb(255, 140, 0));
			     } else {
			         parent.getChildAt(i).setBackgroundColor(0);
			     }
			 }
			onErgebnisListItemClicked(position);
		}
	};
	
	@SuppressWarnings("unchecked")
	private void onErgebnisListItemClicked(int position){
		selHashMap = (HashMap<String, String>) mErgebnisListView.getItemAtPosition(position);
		selectedErgebnisVO = new ErgebnisVO(selHashMap);
		mEdSelectedItemId = selectedErgebnisVO.key;
	}
	
	private final OnItemLongClickListener mErgebnisListViewItemOnLongClickListener = new OnItemLongClickListener() {
		@Override
		public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
			return onBearbeitenErgebnis(arg0, arg2);
		}
	};
	
	private boolean onBearbeitenErgebnis(AdapterView<?> view, int position) {
		for(int i=0; i<view.getChildCount(); i++) {
		     if(i == position) {
		    	 view.getChildAt(i).setBackgroundColor(Color.rgb(255, 140, 0));
		     } else {
		    	 view.getChildAt(i).setBackgroundColor(0);
		     }
		 }
		
		selHashMap = (HashMap<String, String>) mErgebnisListView.getItemAtPosition(position);
		mLoeschenErgebnisButton.setEnabled(true);
		mBearbeitenErgebnisButton.setEnabled(true);
		
		selectedErgebnisVO = new ErgebnisVO(selHashMap);
		mEdSelectedItemId = selectedErgebnisVO.key;
		
		return bearbeitenErgebnis();
	}
	
	private boolean bearbeitenErgebnis(){
		
		selectedErgebnisVO = new ErgebnisVO(selHashMap);
		
		final Intent intent = new Intent(this, ErgebnisAnlegen.class);
		intent.putExtra(INTENT_EXTRA_EDIT_MODE, true);
		intent.putExtra(INTENT_EXTRA_ERGEBNIS, selectedErgebnisVO);
		intent.putExtra(INTENT_EXTRA_SPIELER, aktuellerSpieler);
		
		startActivityForResult(intent, REQUEST_CODE_ERGEBNIS_BEARBEITEN);
		return true;
	}

	private final OnClickListener mErgebnisAnlegenListener = new OnClickListener() {
		public void onClick(View v) {
			onClickErgebnisAnlegen(v);
		}
	};
	
	private final OnClickListener mErgebnisBearbeitenListener = new OnClickListener() {
		public void onClick(View v) {
			bearbeitenErgebnis();
		}
	};
	
	private final OnClickListener mErgebnisLoeschenListener = new OnClickListener() {
		public void onClick(View v) {
			onClickErgebnisLoeschen(v);
		}
	};
	
	public void onClickErgebnisLoeschen(final View sfNormal) {
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		
        builder.setMessage("Gesamtergebnis " +selectedErgebnisVO.gesamtergebnis +" wirklich l�schen?").setCancelable(false).setPositiveButton("Yes", new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int id) {
        	   mErgebnisSpeicher.loescheErgebnis(mEdSelectedItemId);
       		   mLoeschenErgebnisButton.setEnabled(false);
       		   zeigeErgebnisse();
           }
       }).setNegativeButton("No", new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int id) {
        	   dialog.cancel();
           }
       });
        
		AlertDialog alertDialog = builder.create();
		alertDialog.show();
		
	}
	
	@Override
	protected void onListItemClick (ListView l, View v, int position, long id){
		onErgebnisListItemClicked(position);
	}

	public void onClickErgebnisAnlegen(final View sfNormal) {
		final Intent intent = new Intent(this, ErgebnisAnlegen.class);
		intent.putExtra(INTENT_EXTRA_EDIT_MODE, false);
		intent.putExtra(INTENT_EXTRA_SPIELER, aktuellerSpieler);
		
		startActivityForResult(intent, REQUEST_CODE_ERGEBNIS_NEUANLEGEN);
	}
		
	private void zeigeErgebnisse() {
		if(null != aktuellerSpieler){
			List<ErgebnisVO> ergebnisListeVO = mErgebnisSpeicher.ladeErgebnisZumSpielerListeVO(aktuellerSpieler.id);

			hashMapListForListView = new ArrayList<HashMap<String, String>>();

			String[] from = new String[] { ErgebnisTbl.SPIEL_ID, ErgebnisTbl.GESAMT_ERGEBNIS, ErgebnisTbl.VOLLE_25_1,
					ErgebnisTbl.ABRAEUMEN_25_1, ErgebnisTbl.FEHL_25_1, ErgebnisTbl.VOLLE_25_2, ErgebnisTbl.ABRAEUMEN_25_2,
					ErgebnisTbl.FEHL_25_2 };
			int[] to = new int[] { R.id.col_ergebnis_spiel_id, R.id.col_ergebnis_gesamtergebnis, R.id.col_ergebnis_volle_1,
					R.id.col_ergebnis_abraeumen_1, R.id.col_ergebnis_fehler_1, R.id.col_ergebnis_volle_2,
					R.id.col_ergebnis_abraeumen_2, R.id.col_ergebnis_fehler_2 };

			HashMap<String, String> entitiesHashMap = null;
			for (ErgebnisVO ergebnisVO : ergebnisListeVO) {
				entitiesHashMap = new HashMap<String, String>();
				entitiesHashMap.put(ErgebnisTbl.ID, String.valueOf(ergebnisVO.key));
				
				entitiesHashMap.put(ErgebnisTbl.SPIEL_ID, String.valueOf(ergebnisVO.spielId));
				entitiesHashMap.put(ErgebnisTbl.SPIEL_ZEIT, ergebnisVO.spielZeit);
				
				SimpleDateFormat df = new SimpleDateFormat( "DD.MM.yyyy" );
				try {
					String d = df.parse(ergebnisVO.spielZeit).toString();
					d.getBytes();
				} catch (ParseException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
				
				entitiesHashMap.put(ErgebnisTbl.SPIELER_ID, String.valueOf(ergebnisVO.spielerId));
				entitiesHashMap.put(ErgebnisTbl.MANNSCHAFT_ID, String.valueOf(ergebnisVO.mannschaftId));
				
				entitiesHashMap.put(ErgebnisTbl.GESAMT_ERGEBNIS, String.valueOf(ergebnisVO.gesamtergebnis));
				entitiesHashMap.put(ErgebnisTbl.ERGEBNIS_50_1, String.valueOf(ergebnisVO.ergebnis501));
				entitiesHashMap.put(ErgebnisTbl.ERGEBNIS_50_2, String.valueOf(ergebnisVO.ergebnis502));
				
				
				entitiesHashMap.put(ErgebnisTbl.VOLLE_25_1, String.valueOf(ergebnisVO.volle251));
				entitiesHashMap.put(ErgebnisTbl.ABRAEUMEN_25_1, String.valueOf(ergebnisVO.abraeumen251));
				entitiesHashMap.put(ErgebnisTbl.FEHL_25_1, String.valueOf(ergebnisVO.fehl251));

				entitiesHashMap.put(ErgebnisTbl.VOLLE_25_2, String.valueOf(ergebnisVO.volle252));
				entitiesHashMap.put(ErgebnisTbl.ABRAEUMEN_25_2, String.valueOf(ergebnisVO.abraeumen252));
				entitiesHashMap.put(ErgebnisTbl.FEHL_25_2, String.valueOf(ergebnisVO.fehl252));

				
				hashMapListForListView.add(entitiesHashMap);
			}

			SimpleAdapter adapterForList = new SimpleAdapter(this, hashMapListForListView, R.layout.ergebnis_grid_item,
					from, to);

			setListAdapter(adapterForList);
		}
	}
}
